<HTML>
<HEAD>
<TITLE>
IndiceHashExtensible.h
</TITLE>
</HEAD>
<BODY>
<PRE>
<font color="green">/*
 * IndiceHashExtensible.h
 *
 *  Created on: 29/10/2009
 *      Author: Francisco
 */</font>
<font color="blue">#ifndef</font> INDICEHASHEXTENSIBLE_H_
<font color="blue">#define</font> INDICEHASHEXTENSIBLE_H_

<font color="blue">#include</font> <font color="maroon">"Cubo.h"</font>
<font color="blue">#include</font> <font color="maroon">"HashChange.h"</font>
<font color="blue">#include</font> <font color="maroon">"EstrategiaIndice.h"</font>
<font color="blue">#include</font> <font color="maroon">&#60;stdlib.h&#62;</font>
<font color="blue">#include</font> <font color="maroon">&#60;string.h&#62;</font>
<font color="blue">#include</font> <font color="maroon">"../Buffer.h"</font>
<font color="blue">#include</font> <font color="maroon">&#60;vector&#62;</font>
<font color="blue">#include</font> <font color="maroon">&#60;cmath&#62;</font>

<font color="blue">using</font> <font color="blue">namespace</font> std;

<font color="blue">class</font> IndiceHashExtensible <font color="black">:</font> <font color="blue">public</font> EstrategiaIndice<font color="black">{</font>
<font color="blue">private</font><font color="black">:</font>
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> tabla;
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> bloquesLibres;
    vector<font color="black">&#60;</font>Cubo<font color="black">*</font><font color="black">&#62;</font><font color="black">*</font> Cubos;
    vector<font color="black">&#60;</font>HashChange<font color="black">&#62;</font><font color="black">*</font> Modificaciones;
    
    <font color="green">/**
     * redispersarBloque
     * 
     * Se redispersan todas las claves de ese bloque
     * 
     * @author Francisco
     * 
     * @param unsigned int bloque El bloque que se va a dispersar las claves
     * 
     */</font>
    <font color="blue">void</font> redispersarBloque <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> bloque<font color="black">)</font>;
    <font color="green">/**
     * posicionTabla
     * 
     * La funcion para acceder a la tabla con la clave
     * 
     * @author Francisco
     * 
     * @param unsigned long int clave La clave que se le aplica la funcion
     * 
     * @return unsigned int pos La posicion que se encuentra de la tabla
     * 
     */</font>
    <font color="blue">unsigned</font> <font color="blue">int</font> posicionTabla <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> clave<font color="black">)</font>;
    <font color="green">/**
     * Hash
     * 
     * La funcion de Hashing
     * 
     * @author Francisco
     * 
     * @param unsigned long int clave La clave que se le aplica la funcion de hash
     * 
     * @return unsigned int bloque El numero de bloque que se encuentra la clave
     * 
     */</font>
    <font color="blue">unsigned</font> <font color="blue">int</font> Hash <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> clave<font color="black">)</font>;
    <font color="green">/**
     * compactarTabla
     * 
     * Se fija si la tabla esta duplicada, si esta duplicada se trunca la mitad
     * 
     * @author Francisco
     * 
     */</font>
    <font color="blue">void</font> compactarTabla<font color="black">(</font><font color="black">)</font>;
    
<font color="blue">public</font><font color="black">:</font>
    <font color="green">/**
    * Constructor IndiceHashExtensible
    *
    * Crea un indiceHashExtensible nuevo con la clave primaria
    *
    * @author Francisco
    *
    * @param primaryKey es la clave primaria
    * 
    */</font>
    IndiceHashExtensible<font color="black">(</font>PrimaryKey<font color="black">*</font> primaryKey<font color="black">)</font> <font color="blue">throw</font><font color="black">(</font>IndexException<font color="black">)</font>;
    <font color="green">/**
    * Destructor IndiceHashExtensible
    *
    * Libera los recursos asociados
    *
    * @author Francisco
    *
    */</font>
    ~IndiceHashExtensible<font color="black">(</font><font color="black">)</font>;
    <font color="green">/**
    * Cargar
    *
    * Carga el dato en el indice
    *
    * En caso de inidce primario si el identificador esta repetido
    * tira IndexException
    *
    * @author Francisco
    *
    * @param void* dato serializado a agregar en el indice
    *
    * @param int id en que esta guardado el dato
    *
    */</font>
    <font color="blue">void</font> Cargar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> datoSerializadoACargar, <font color="blue">unsigned</font> <font color="blue">int</font> id<font color="black">)</font> <font color="blue">throw</font><font color="black">(</font>IndexException<font color="black">)</font>;
    <font color="green">/**
    * Buscar
    *
    * Busca el dato indexado con la clave dada
    *
    * @author Francisco
    *
    * @param std::string clave que se busca en el indice
    *
    * @return std::vector&#60;unsigned int&#62; vector con el numero del bloque que se encuentra el dato
    *
    */</font>
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font> Buscar<font color="black">(</font>std<font color="black">:</font><font color="black">:</font>string claveABuscar<font color="black">)</font>;
    <font color="green">/**
    * Modificar
    *
    * cambia los datos en el indice
    *
    * @author Francisco
    *
    * @param DatoSerializadoSinModificar datos serializados sin modificar
    *
    * @param DatosSerializadoModificado datos serializados modificados
    *
    * @param idModificado id de los datos modificados
    *
    */</font>
    <font color="blue">void</font> Modificar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> DatoSerializadoSinModificar, <font color="blue">char</font><font color="black">*</font> DatoSerializadoModificado, <font color="blue">unsigned</font> <font color="blue">int</font> idModificado<font color="black">)</font>;

    <font color="green">/**
    * Eliminar
    *
    * Elimina el dato del indice
    *
    * @author Francisco
    *
    * @param DatoSeralizadoAEliminar
    *
    */</font>
    <font color="blue">void</font> Eliminar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> DatoSerializadoAEliminar<font color="black">)</font>;

    <font color="green">/**
     * getModificaciones
     * 
     * Devuelve las modificaciones de la redispersion de claves de algun bloque
     * 
     * @author Francisco
     * 
     * @return vector&#60;HashChange&#62;* El vector de las modificaciones luego de la redispersion
     * 
     */</font>
    vector<font color="black">&#60;</font>HashChange<font color="black">&#62;</font><font color="black">*</font> getModificaciones<font color="black">(</font><font color="black">)</font>;
    
<font color="black">}</font>;

<font color="blue">#endif</font> <font color="green">/* ESTRATEGIAINDICE_H_ */</font>

</PRE>
</BODY>
</HTML>
